package com.lsq.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @ClassName: IOUtil 
 * @Description: 流处理工具类
 * @author: charles
 * @date: 2021年7月20日 下午7:40:46
 */
public class IOUtil {

	/**批量关闭流
	 * @param closeables
	 * @throws Exception
	 */
	public static void closings(AutoCloseable...  closeables) throws Exception {
        // 非空判断
        if (closeables != null) {
             // 循环关闭
             for (AutoCloseable auto : closeables) {
                 // 非空判断
                 if (auto != null) {
                      auto.close();
                 }
             }
        }
    }
	
	// 自定义流是否关闭
    /**文件复制
     * @param inputStream
     * @param outputStream
     * @param closeInputStream
     * @param closeOutputStream
     * @throws Exception
     */
    public static void copy(InputStream inputStream,  OutputStream outputStream, boolean closeInputStream, boolean closeOutputStream) throws  Exception {
       
    	// 用于复制的字节数组
         byte[] b = new byte[1024];
         int len = 0;
         // 复制，如果讀取到的數據 >0 ,證明讀取到了數據
         while ((len = inputStream.read(b)) > 0) {
              // 将数据写入输出流
              outputStream.write(b, 0, len);
         }
         inputStream.close();
         outputStream.close();
         // 关闭流->决定是否还要继续操作该文件
         if (closeInputStream) {
              closings(inputStream);
         }
         if (closeOutputStream) {
              closings(outputStream);
         }
     }
    
 // 自定义编码格式和是否关闭流
    /**读取文件信息拼接成字符串
     * @param inputStream
     * @param encode
     * @param isClose
     * @return
     * @throws Exception
     */
    public static String asString(InputStream inputStream,  String encode, boolean isClose) throws Exception {
         // 存放结果
         StringBuffer sb = new StringBuffer();
         // 用于复制的字节数组
         byte[] b = new byte[1024];
         int len = 0;
         // 复制，如果读取的个数 > 0，证明读取到了数据
         while ((len = inputStream.read(b)) > 0) {
              // 将数据写入StringBuffer
              sb.append(new String(b, 0, len, encode));
         }
         // 关流
         if (isClose) {
              closings(inputStream);
         }
         return sb.toString();
    }
    
    // 自定义编码格式
    /**读取正行放入集合
     * @param textFile
     * @param encode
     * @return
     * @throws Exception
     */
    public static List<String> readingLineFormTextFile(File  textFile, String encode) throws Exception {
         // 存放结果
         List<String> list = new ArrayList<String>();
         // 缓冲字符输入流
         BufferedReader br = new BufferedReader(new FileReader(textFile));
         // 用于存入复制的数据
         String str = null;
         // 复制，如果读取的不为空，证明读取到了数据
         while ((str = br.readLine()) != null) {
              list.add(str);
         }
         // 关流
         closings(br);
         return list;
     }
    
    //java 通过url下载图片保存到本地
    public static void download(String urlString, int i) throws Exception {
        // 构造URL
        URL url = new URL(urlString);
        // 打开连接
        URLConnection con = url.openConnection();
        // 输入流
        InputStream is = con.getInputStream();
        // 1K的数据缓冲
        byte[] bs = new byte[1024];
        // 读取到的数据长度
        int len;
        // 输出的文件流
        String filename =  i + ".jpg";  //下载路径及下载图片名称
        File file = new File(filename);
        FileOutputStream os = new FileOutputStream(file, true);
        // 开始读取
        while ((len = is.read(bs)) != -1) {
            os.write(bs, 0, len);
        }
        System.out.println(i);
        // 完毕，关闭所有链接
        os.close();
        is.close();
    }
}
